package nan.List;

public class MyArrayList {
        //属性
        private String[] data=null;
        //当前顺序表中的有效元素个数
        private int size=0;
        //当前顺序表中的最大容纳元素个数，如果size超过了capacity就需要扩容
        private int capacity=100;
        //方法：增删改查
    public MyArrayList(){
        data=new String[capacity];
    }
    //扩容方法
    private void realloc(){
        //先把capacity变大
        capacity=2*capacity;
        String[] newData=new String[capacity];
        //把旧的数组中的数据拷贝到新数组中
        for(int i=0;i<data.length;i++){
            newData[i]=data[i];
        }
        //把新的数组赋给原有的属性data，同时就会有释放掉旧的数组
        data=newData;//让新的代替旧的
    }
    //1.把元素尾插到顺序表末尾
    public void add(String elem){
        if(size>=capacity){
            //需要先扩容
            realloc();
        }
        data[size]=elem;
        size++;
    }
    //2、把元素插入到任意中间位置
    public void add(int index,String elem) {
        //如果index==size，相当于把新元素插入到末尾
        if(index<0||index>size){
            return;
        }
        if (size >= capacity) {
            //需要先扩容
            realloc();
        }
        //把elem放到index的位置上，不能覆盖掉已有的元素
        //需要把index位置的元素，依次往后搬运，给index位置腾出空闲空间放置新的元素
        for(int i=size-1;i>=index;i--){
            data[i+1]=data[i];
        }
        //搬运完毕，把新的元素放到index位置上
        data[index]=elem;
        size++;
    }
    //3.按照下标位置删除元素,这个方法的返回结果就是被删掉的元素
    public String remove(int index){
        //仍然需要进行搬运，把index位置的元素覆盖掉即可
        if(index<0||index>=size){
            return null;
        }
        //String result=data[index];
        for(int i=index;i<size-1;i++){
            data[i]=data[i+1];
        }
        size--;
        return data[index];
    }
    //4.按照元素的值来删除元素
    public boolean remove(String elem){
        //先找到元素所在的位置
        int index=0;
        for (;index<size;index++){
            if(data[index].equals(elem)){
                break;
            }
        }
        if (index >= size) {
            //没找到匹配的元素，删除失败
            return false;
        }
        //找到匹配的元素，从i位置开始进行搬运
        for(int i=index;i<size-1;i++){
            data[i]=data[i+1];
        }
        size--;
        return true;
    }
    //5.根据下标获取元素
    public String get(int index){
        if(index<0||index>=size){
            return null;
        }
        return data[index];
    }
    //6.根据下标修改元素
    public String  set(int index,String elem){
        if(index<0||index>=size){
            return null;
        }
        data[index]=elem;
        return data[index];
    }
    //7.判读元素是否存在
    public boolean contains(String elem){
        for(int i=0;i<size;i++){
            if(data[i].equals(elem));
            return true;
        }
        return false;
    }
    //8.查找元素位置
    public int indexOf(String elem){
        for(int i=0;i<size;i++){
            if(data[i].equals(elem)){
                return i;
            }
        }
        return -1;
    }
    //9.查找元素位置（从后往前）
    public int lastIndexOf(String elem){
        for(int i=size-1;i>=0;i--){
            if(data[i].equals(elem)){
                return i;
            }
        }
        return -1;
    }
    public void clear(){
        size=0;
    }
    public int size(){
        return size;
    }
    public boolean isEmpty(){
       if(size==0){
           return true;
       }
       return false;
    }
    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            stringBuilder.append(data[i]);
            if (i < size - 1) {
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
    private static void testAdd(){
        MyArrayList myArrayList=new MyArrayList();
        //1.验证尾插
        myArrayList.add("a");
        myArrayList.add("b");
        myArrayList.add("c");
        System.out.println(myArrayList);
        //2.验证中间位置插入
        myArrayList.add(1,"e");
        System.out.println(myArrayList);
    }
    private static void testRemove(){
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add("a");
        myArrayList.add("b");
        myArrayList.add("c");
        myArrayList.add("d");


        myArrayList.remove(1);
        System.out.println(myArrayList);
        myArrayList.remove("c");
        System.out.println(myArrayList);
    }
    private static void testGetAndSet(){
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add("a");
        myArrayList.add("b");
        myArrayList.add("c");
        myArrayList.add("d");
        System.out.println(myArrayList.get(1));
        myArrayList.set(1,"k");
        System.out.println(myArrayList);
    }
    private static void testContainsAndIndexOF(){
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add("a");
        myArrayList.add("b");
        myArrayList.add("c");
        myArrayList.add("d");
        System.out.println(myArrayList.contains("c"));
        System.out.println(myArrayList.indexOf("c"));
        System.out.println(myArrayList.lastIndexOf("c"));
    }
    private static void nnn(){
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add("a");
        myArrayList.add("b");
        myArrayList.add("c");
        myArrayList.add("d");
        System.out.println(myArrayList.size);
        System.out.println(myArrayList.isEmpty());
        myArrayList.clear();
        System.out.println(myArrayList.isEmpty());
    }
    public static void main(String[] args) {
        //testRemove();
        //testGetAndSet();
        //testContainsAndIndexOF();
        nnn();
    }
}
